/*
 * Projekt: GMU 2013 - Canny hranovy detektor OpenCL/CUDA
 * Autori: Pavel Nevrala - xnevra00 (xnevra00@stud.fit.vutbr.cz)
 *         Martin Jurak - xjurak02 (xjurak02@stud.fit.vutbr.cz)
 */
#pragma once

#include "cannypartsbase.h"

/*
 * class SobelFilterCL
 * Provede nastaveni OpenCl a kernelu pro vypocet gradientu obrazu a jejich smeru.
 * Sobeluv operator ve smeru X a Y je proveden separabilnimi filtry pro kazdy smer 
 * SobelXX - {1,0,-1} (Sobel oprerator ve smeru X, maska pro radkovy filtr)
 * SobelXY - {1,2,1} (Sobel oprerator ve smeru X, maska pro sloupcovy filtr)
 * SobelYX - {1,2,1} (Sobel oprerator ve smeru Y, maska pro radkovy filtr)
 * SobelYY - {1,0,-1} (Sobel oprerator ve smeru Y, maska pro sloupcovy filtr)
 * pro sloupcove a radkuve filtry je provedena konvoluce s obrazem.
 */

class SobelFilterCL :
	public CannyPartsBase
{
public:
	SobelFilterCL(cl_uint maxWorkGroupP, cl_context *contextP, cl_command_queue *commandQueueP, cl_program *programP);
	~SobelFilterCL(void);

	/*
	 * Provede nastaveni OpenCl a kernelu pro vypocet gradientu obrazu a jejich smeru
	 * @image - vstupni obraz
	 * @width - sirka obrazu
	 * @height - vyska obrazu	 
	 * @return - doba vypoctu na GPU
	 */
	virtual double run(cl_float *image, cl_uint width, cl_uint height);

	/*
	 * Vrati obraz obsaujici smer gradientu jednotlivych pixelu	  
	 * @return - smer gradientu
	 */
	cl_float *getEdgesDirection(){return edgesDirection;};	

private:	
	// smer gradientu jeddnotlivych pixelu
	cl_float *edgesDirection;
	// opencl context
	cl_context *context;
	// command queue
	cl_command_queue *commandQueue;
	// zkompilovny opencl program
	cl_program *program;	
};

